编程语言
首页 > 编程语言> > java-休眠-保留策略模式的组合接口

java-休眠-保留策略模式的组合接口

作者:互联网

我具有以下类结构:

public abstract class Creature{
   private String name;
   //strategy pattern composition
   private SkillInterface skill;
}

public interface SkillInterface {
   void attack();
}

public class NoSkill implements SkillInterface {
   @Override
   public void attack() {
       //statements
   }
}

我的目标是将Creature对象持久保存在数据库的一张表中. SkillInterface的子类没有任何字段.当他们确定行为时,我想将选定的SkillInterface类名称转换为String,因为我只需要使用Skill.getClass().getSimpleName()这样的String来保留生物当前技能策略的类名称.我尝试使用@Converter注释来实现它,使用AttributeConverter类将SkillInterface转换为String并保存,但是始终有映射异常.我希望能够将其另存为String并作为SkillInterface对象进行检索.

但是我该如何用Hibernate来实现呢?还是我有设计错误?

解决方法:

好的,看来我已经找到了可以用于保留策略模式接口实现的基本解决方案.我使用@Converter批注和AttributeConverter类将策略类名称转换为列,同时保存到数据库中,并将检索到的String强制转换回策略类,如下所示:

@Entity
public class Creature {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @Convert(converter = SkillConverter.class)
    private SkillInterface skill;
}

public class SkillConverter implements AttributeConverter<SkillInterface,String> {
    @Override
    public String convertToDatabaseColumn(SkillInterface skill) {
        return skill.getClass().getSimpleName().toLowerCase();
    }

    @Override
    public SkillInterface convertToEntityAttribute(String dbData) {
        //works as a factory
        if (dbData.equals("noskill")) {
            return new NoSkill();
        } else if (dbData.equals("axe")) {
            return new Axe();
        }
        return null;
    }
}

public interface SkillInterface {
    public String getSkill();

    void attack();
}


public class NoSkill implements SkillInterface{
    public String getSkill() {
        return getClass().getSimpleName();
    }

    @Override
    public void attack() {
        //strategy statements
    }
}

标签:database-design,hibernate,relational-database,java,design-patterns
来源: https://codeday.me/bug/20191108/2010157.html