Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果实体已经存在,如何按属性返回实体?_Java_Hibernate - Fatal编程技术网

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;
}