Mysql
 sql >> Database >  >> RDS >> Mysql

Sto cercando di creare due diverse tabelle di mappatura manytoone in una singola colonna per una classe di entità

Penso che quello che stai cercando sia spiegato in Sezione ORM in sospensione relativa a @Any annotazione :

@Any(metaColumn = @Column(name = "userType"))
@AnyMetaDef(name = "PropertyMetaDef", metaType = "string", idType = "long",
            metaValues = {
                    @MetaValue(value = "User", targetEntity = User.class),
                    @MetaValue(value = "LDAP", targetEntity = LDAPUser.class)
            }
    )
@JoinColumn(name="assignedto_id", referencedColumnName="id", insertable=false, updatable=false)   
private Object assignedTo

Ma non creerà chiavi esterne. Non credo nemmeno sia possibile creare due chiavi esterne sulla stessa colonna per tabelle diverse (ha senso?).

In alternativa, se le due classi potessero estendersi da una superclasse comune, potresti usare Mappatura dell'ereditarietà per ottenere qualcosa di simile.

Ad esempio:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public static class UserEntity {

    @Id
    private Long id;

    ...
}

@Entity
public class User extends UserEntity {
...
}

@Entity
public class LDAPUser extends UserEntity {
...
}

e poi

      @ManyToOne
      @JoinColumn(name="assignedto_id", referencedColumnName="id", insertable=false, updatable=false)   
      private UserEntity assignedto;

Questo creerà tre tabelle però. La tabella UserEntity avrà una chiave esterna su assignedto_id colonna. User id e LDAPUser id avrà un vincolo ciascuno su UserEntity id. In sostanza, avvicinarsi a ciò che avevi chiesto all'inizio.