Java 如果实体已经存在,如何按属性返回实体?
现在,当我持久化Java 如果实体已经存在,如何按属性返回实体?,java,hibernate,Java,Hibernate,现在,当我持久化ProductText时,每次都会生成一个新的语言对象 我可以防止这种情况发生吗?如果存在code='en'的语言表条目,则应链接现有实体 我最初的目标是不必在我的产品文本表中多次重复countryCodeString“EN”,而只需引用id。但这真的有意义吗?我应该只使用普通的字符串而不使用额外的表吗?(稍后我想查询ProductText列表,其中lang='de') 唯一的更改是执行select,比如之前的dao.findByLang(“en”)? 或者还有一些hiberna
ProductText
时,每次都会生成一个新的语言
对象
我可以防止这种情况发生吗?如果存在code='en'
的语言表条目,则应链接现有实体
我最初的目标是不必在我的产品文本表中多次重复countryCodeString“EN”,而只需引用id。但这真的有意义吗?我应该只使用普通的字符串而不使用额外的表吗?(稍后我想查询ProductText列表,其中lang='de'
)
唯一的更改是执行select,比如之前的dao.findByLang(“en”)
?
或者还有一些hibernate特性可以支持这一点,而无需自己显式执行查询?您是进一步处理值“en”还是直接显示它?如果只用于显示目的,我只会存储字符串,但是,如果您想通过使用外键ID来减少冗余,则必须创建一个包含语言字符串en
的实体,该字符串可以通过实体管理器持久化,并且在持久化之前必须从实体管理器中获取该字符串。如果语言中的唯一值是2或3个字母的字符串,为什么不把字符串作为一个成员呢?这将更快、更高效。如果该语言只有三个不同的可能值,您也可以使用如下枚举:
@Entity
public class Language {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(length = 2)
private String code; //EN, DE, US
public Language(String code) {
this.code = code;
}
}
@Entity
public class ProductText {
@OneToOne(Cascade.ALL)
private Language lang;
}
ProductText text = new ProductText();
text.setLang(new Language("en")); //what if "en" exists?
dao.save(text);
EnumType.STRING
将枚举作为字符串存储在数据库中,而EnumType.ORDINAL
将其存储为int。int可能更有效,但如果在枚举中插入新值,映射可能会更改。字符串更灵活,因为它将使用枚举成员的名称
在这两种情况下,您都不必管理单独的实体,hibernate也不会创建额外的表,而且它比使用普通字符串更安全。是的,这是可能的,缺点是每个实体中有大量的2个字母代码,而不仅仅是一个外键。问题是:什么是更好的方法?
public enum Language {
EN("EN"),
DE("DE"),
US("US");
private String code; //EN, DE, US
public Language(String code) {
this.code = code;
}
// Getter...
}
@Entity
public class ProductText {
@Enumerated(EnumType.STRING)
// Or @Enumerated(EnumType.ORDINAL)
private Language lang;
}