0

Ich bin mit Java + Spring + Hibernate@OneToOne Mit @JoinColumn, die nur die UUID anstelle des gesamten Objekts hält

Wenn Sie den folgenden Code zu testen, erhalte ich eine Fehlermeldung:

javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.XXX.XXX.entity.Policy.id

@Entity 
@Table(name = "assignment") 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Assignment extends BaseEntity { 

    @Id 
    @Column(name = "id") 
    @Type(type = "pg-uuid") 
    @NotTracked 
    private UUID id; 

    @OneToOne(targetEntity = Policy.class) 
    @JoinColumn(name = "policy_id", nullable = false, referencedColumnName = "policy_id") 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    @TrackedEntity(isIdentityField = true) 
    private UUID policyID; 
} 

@Entity 
@Table(name = "policy") 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "policy") 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Policy extends BaseEntity { 

    @Id 
    @Column(name = "policy_id") 
    @Type(type = "pg-uuid") 
    @NotTracked 
    private UUID id; 

    ... 
    ... 
    .. 

} 

Wenn die private UUID policyID; von UUID zu Policy ändern, seine Arbeit ganz gut, ist es eine Möglichkeit, irgendwie einen Bezug auf spezielle Objekt innerhalb Politik als ID einzustellen, anstatt das gesamte Objekt der Politik innerhalb der Zuordnungsobjekt hält?

Antwort

1

Es ist möglich, nur die UUID einzuschließen, aber es wird nicht mehr ein überwinterter Managed FK sein. Ich rate nicht diese, wie Sie Hibernate möchten Ihre FK zu verwalten .. Sie einfach Assignment ändern würde:

@Entity 
@Table(name = "assignment") 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Assignment extends BaseEntity { 

    @Id 
    @Column(name = "id") 
    @Type(type = "pg-uuid") 
    @NotTracked 
    private UUID id; 

    @Column(name="policy_id") 
    private UUID policyID; 
} 

Damit wird gesagt, verlieren Sie alle Cascade-Optionen und FK Check-Einschränkungen gegen dieses Feld, wenn Sie füge sie manuell zu deiner Datenbank hinzu.

0

Ich denke, es gibt keinen Grund für die Verwendung der UUID anstelle der Verweis auf das Policy-Objekt. Sie können mit Anmerkungen versehen, dass das Objekt langsam geladen werden soll. Daher wird es nur aus der Datenbank geladen, wenn Sie auf ein anderes Attribut des Richtlinienobjekts zugreifen möchten:

@OneToOne (targetEntity = Policy.class, fetch = FetchType .LAZY)

Verwandte Themen