Каскад Hibernate OnDelete (@ManyToOne) не работает для MySql - PullRequest
0 голосов
/ 15 мая 2018

У меня есть сопоставление ManyToOne, и я хочу удалить все дочерние элементы при удалении Parent. К сожалению, @OnDelete (action = OnDeleteAction.CASCADE) создает ограничение внешнего ключа (on delete = restrict), которое является значением по умолчанию для детский стол.

Класс сущности:

@Entity
@Table(name = "location_poc")
public class LocationPOC {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, unique = true)
    private Integer id;

    @Column(name = "contactname", nullable=false)
    private String contactname;

    @Column(name = "email", nullable=true)
    private String email;

    @Column(name = "phone", nullable=true)
    private String phone;

    @Column(name = "title", nullable=false)
    private String title;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "locationID", referencedColumnName = "locationID")
    @OnDelete(action = OnDeleteAction.CASCADE)

    private Location location;

Создать выписку:

CREATE TABLE `location_poc` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `contactname` varchar(50) NOT NULL,
   `email` varchar(100) DEFAULT NULL,
   `phone` varchar(50) DEFAULT NULL,
   `title` varchar(50) NOT NULL,
   `locationID` int(11) NOT NULL,
   PRIMARY KEY (`id`),
   KEY `locationID_idx` (`locationID`),
   CONSTRAINT `FK65jm2e3enqcu1nd37x48l57it` FOREIGN KEY (`locationID`) REFERENCES `location` (`locationID`),
   CONSTRAINT `locationID` FOREIGN KEY (`locationID`) REFERENCES `location` (`locationID`) ON DELETE CASCADE ON UPDATE NO ACTION
 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

Примечание. Каскадное ограничение на удаление - это то, которое я создал вручную при создании таблицы и других ограничений, созданных hibernate.

Я не уверен, почему ondeleteaction.cascade не работает. Любая помощь очень ценится.

1 Ответ

0 голосов
/ 28 ноября 2018

Пользовательский диалект:

public class MySQLDialect extends MySQL57Dialect {
public MySQLDialect(){
    super();
}

public boolean supportsCascadeDelete(){
    System.out.println("--- supportsCascadeDelete() called.");
    return true;
}
}

Использование через persistences.xml

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
                         http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
         version="2.2">
<persistence-unit name="..." transaction-type="RESOURCE_LOCAL">

    <properties>
        <property name="hibernate.dialect" value="ORM.DBSubsystem.MySQLDialect"/>
    </properties>

</persistence-unit>
</persistence>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...