JPA单表继承:不是托管类型

时间:2017-06-06 10:27:17

标签: java spring spring-mvc jpa spring-boot

我使用

有一个Spring Boot应用程序(嵌入式Tomcat,Thymeleaf模板......)
private void Button_Click(object sender, RoutedEventArgs e)
{
    // Initialize and show
    var dialog = new System.Windows.Forms.FolderBrowserDialog();
    System.Windows.Forms.DialogResult result = dialog.ShowDialog();

    // Process result
    if (result == System.Windows.Forms.DialogResult.OK)
    {
        string selectedPath = dialog.SelectedPath;

        Button clickedButton = sender as Button;
        StackPanel sp = clickedButton.Parent as StackPanel;
        if (sp != null)
        {
            TextBox SelectedFolderTextBox = sp.Children.OfType<TextBox>().FirstOrDefault(x => x.Name == "SelectedFolderTextBox");
            if (SelectedFolderTextBox != null)
                SelectedFolderTextBox.Text = selectedPath;
        }
    }
}

我使用JPA和Hibernate的继承策略

我有这堂课:

spring-boot-starter-data-jpa

和另一个:

@Entity
@Table(name="t_alarm_notification")
@Inheritance (strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name= "ALARM_TYPE")
public abstract class AlarmNotification  implements Serializable {
..
}

和另一个

   @MappedSuperclass
    public class BookAlarmNotification extends AlarmNotification {

        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        private Book book;

..
}

但是运行集成测试或者只是启动String Boot应用程序。我收到了这个错误:

public interface BookAlarmNotificationRepository extends CrudRepository<BookAlarmNotification, Long> {

}

2 个答案:

答案 0 :(得分:3)

在我们在第11.1.38节(PDF页面471)中找到的JPA 2.1 specification文档中:

  

MappedSuperclass注释指定一个类,其映射信息应用于从其继承的实体。映射的超类没有为其定义单独的表。

     

...

     

使用MappedSuperclass注释指定的类可以以与实体相同的方式映射,除了映射将仅应用于其子类,因为映射不存在表   超类本身。

所以问题源于这样一个事实:您的实体类AlarmNotification被错误地用作BookAlarmNotification的基类。正如#34; Abdullah Khan&#34;的评论中所指出的,正确的注释方式是:

注释抽象基类AlarmNotification,如:

@MappedSuperclass
@Inheritance (strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name= "ALARM_TYPE") 
public abstract class AlarmNotification  implements Serializable {
   //..
}

对从中继承的类使用@Entity注释:

@Entity
@Table(name="t_book_alarm_notification")
public class BookAlarmNotification extends AlarmNotification {
   //..
}

因此, UnsatisfiedDependencyException / IllegalArgumentException

  

不是托管类型:class com.nicinc.persistence.domain.backend.BookAlarmNotification

不应再发生,因为它现在作为应用程序中的托管实体存在。

希望它有所帮助。

答案 1 :(得分:2)

@Entity
@Table(name="d_intervenant_tc")
@Inheritance(strategy= InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="Type", discriminatorType=DiscriminatorType.STRING)
public class Intervenant {

}

@Entity
public class Affilie extends Intervenant{
}