sql >> Base de Datos >  >> RDS >> Mysql

Estoy tratando de hacer dos tablas diferentes de mapeo de muchos a uno en una sola columna para una clase de entidad

Creo que lo que está buscando se explica en Sección ORM de Hibernate sobre @Any anotación :

@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

Pero no creará ninguna clave externa. Ni siquiera creo que sea posible crear dos claves externas en la misma columna para diferentes tablas (¿tiene sentido?).

Alternativamente, si las dos clases pudieran extenderse desde una súper clase común, podría usar Asignación de herencia para lograr algo similar.

Por ejemplo:

@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 {
...
}

y luego

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

Sin embargo, esto creará tres tablas. La tabla UserEntity tendrá una clave externa en el assignedto_id columna. User id y LDAPUser id tendrá una restricción cada uno en UserEntity identificación. Básicamente, acercarte a lo que pediste originalmente.