如何在其他表中没有重复记录的情况下进行休眠保存

时间:2018-07-06 19:55:23

标签: java hibernate

有人可以在以下情况下提供帮助吗?假设我有表1

|----------------|--------------|------------|--------|
|      Salesman  |     Product  |     Year   |  Sold  |
|----------------|--------------|------------|--------|
|      John      |     prod1    |    2015    | 2000   |
|----------------|--------------|------------|--------|
|      John      |     prod1    |    2016    | 2000   |
|----------------|--------------|------------|--------|
|      John      |     prod2    |    2015    | 2000   |
|----------------|--------------|------------|--------|
|      John      |     prod2    |    2016    | 2000   |
|----------------|--------------|------------|--------|
|      Tracy     |     prod1    |    2015    | 2000   |
|----------------|--------------|------------|--------|
|      Tracy     |     prod1    |    2016    | 2000   |
|----------------|--------------|------------|--------|
|      Tracy     |     prod2    |    2015    | 2000   |
|----------------|--------------|------------|--------|
|      Tracy     |     prod2    |    2016    | 2000   |
|----------------|--------------|------------|--------|

如表1所示,业务员,产品不是唯一键。但是,现在我想保存到表2,其中包含有关业务员和产品组合的一些详细信息。换句话说,我希望业务员和产品在表2中是唯一的。

    |----------------|--------------|--------|
    |      Salesman  |     Product  |priority|
    |----------------|--------------|--------|
    |      John      |     prod1    | true   |
    |----------------|--------------|--------|
    |      John      |     prod2    | false  |
    |----------------|--------------|--------|
    |      Tracy     |     prod1    | true   |
    |----------------|--------------|--------|
    |      Tracy     |     prod2    | true   |
    |----------------|--------------|--------|

无论如何,我可以使用以下实体进行休眠。

@Entity
@Table(name = "table1")
public class EntityTable1() {
    private String salesman;
    private String product;
    private int year;
    private int sold;
    private List<EntityTable2> entityTable2;

    ....
}

@Entity
@Table(name = "table2")
public class EntityTable2() {
    private String salesman;
    private String product;
    private boolean priorityTarget;

    ....
}  

无论如何,当我保存EntityTable1对象时,会保存EntityTable2级联并确保table2没有重复的行吗?我了解还有其他方法可以更改实体或数据库设计。但是,由于我正在处理由其他团队构建和使用的项目,因此我不能简单地更改表1架构。但是我可以为表2做任何事情。请帮忙。谢谢。

2 个答案:

答案 0 :(得分:0)

您应该能够使用Hibernate Interceptor实现此目的。您可以将table2的对象保存在table1的onSave事件中。

为确保唯一性,您需要检查记录是否存在,如果存在,请更新同一记录,否则请创建一个新记录。

答案 1 :(得分:0)

这很大程度上取决于您想要在EntityTable2中唯一的内容。您是否希望所有字段的组合都是唯一的?在这种情况下,您将需要以下内容:

@Table(
   name = "table2", 
   uniqueConstraints = {@UniqueConstraint(columnNames = {"salesman", "product", "priorityTarget"})}
)

您是否希望各个字段唯一?然后,您需要这样的东西:

@Table(
        name = "table2",
        uniqueConstraints = {
                @UniqueConstraint(columnNames = "salesman"),
                @UniqueConstraint(columnNames = "product"),
                @UniqueConstraint(columnNames = "priorityTarget")
        }
)

当然,您可以将以上内容混合搭配。

希望这会有所帮助!