0

我对禁用 JoinTable 的删除有问题。

@Entity 
class Employee
{
     @Id
     Long id;

     @ManyToOne( cascade = { CascadeType.REFRESH } )
     @JoinTable( name = "Employee2AddressOracleView",
                 joinColumns = @JoinColumn( name = "employee_id" ), 
                 inverseJoinColumns = @JoinColumn( name = "address_id" ) 
     private Address address;
)

员工的地址在视图中计算。它有效,我可以加载员工,但是当我想删除员工时,JPA 想从视图中删除行。可以禁用此删除查询吗?

控制台中的 JPA 查询:

delete from Employee where employee_id = ?
delete from Employee2AddressOracleView where employee_id = ?
4

2 回答 2

0

如果您使用的是 EclipseLink,您可以使用 DescriptorCustomizer 使映射成为只读的。

于 2013-09-03T14:08:26.927 回答
0

接受的答案具有指向已死的休眠论坛的链接。我设法在archive.org上拉出链接。

解决方案是创建一个表示连接表的单独实体,映射到视图,而不是使用@JoinTable。

主要实体映射:

@Entity
@Table(name="Main")
   public class MainEntity {
   @Id
   @Column(name="id")
   private Integer id;

   @OneToOne
   @PrimaryKeyJoinColumn
   private JoinTableViewEntity joinEntity;
}

加入表视图实体映射:

@Entity
@Table(name="TableView")
public class JoinTableViewEntity {
   @Id
   @Column(name="id")
   private Integer mainEntityId;

   @ManyToOne
   @JoinColumn(name="other_id", updatable=false, insertable=false)
   private OtherEntity other;
}

它也可以在没有可更新和可插入属性的情况下工作。

于 2020-06-10T15:33:50.250 回答