java - 如果实体已经存在,如何通过属性返回实体?

标签 java hibernate

@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);

现在,当我保留 ProductText 时,每次都会生成一个新的 Language 对象。

我可以阻止这种情况吗?如果存在 code = 'en' 的语言表条目,则应链接此现有实体。

我最初的目标是不必在产品文本表中多次重复countryCodeString“EN”,而只需引用ID。但这真的有意义吗?我应该只使用简单的 String 而不使用额外的表吗? (我稍后想要查询 ProductTexts 列表 其中 lang = 'de')。

唯一的改变是之前执行像 dao.findByLang("en") 这样的选择吗? 或者是否还有一些 hibernate 功能可以支持此功能,而无需自己显式执行查询?

最佳答案

对“en”值进行进一步处理还是直接显示?如果仅用于显示目的,我将只存储字符串,但如果您想通过使用外键 ID 来减少冗余,您必须创建一个包含语言字符串的实体en 可以通过实体管理器进行持久化,并且在持久化以重用它之前,您必须从实体管理器中获取它。

关于java - 如果实体已经存在,如何通过属性返回实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32051509/

相关文章:

java - 如何在我的 Java 代码中抛出异常?

java - Getter-Setter 和私有(private)变量

java - 当不级联字段时,是否需要使用@Transient?

java - 使用 Hibernate 检索特定记录

Java JScrollPane 滚动到底部......几乎

java - 从通过命令行给出的参数创建新对象会导致 UncaughtExceptionhandler 抛出 OutOfMemoryError

java - 如何正确添加jar库?

java - Hibernate一对一关系和外键问题

java - JPA @ManyToOne 在删除最后一个子项时自动删除父项

hibernate - 启用运行grails session 工厂