有人可以在以下情况下提供帮助吗?假设我有表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做任何事情。请帮忙。谢谢。
答案 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")
}
)
当然,您可以将以上内容混合搭配。
希望这会有所帮助!