2017-04-10 32 views
0

我不知道为什么我收到的错误:存储过程 'auto_pk_for_table' 未找到

org.apache.cayenne.CayenneRuntimeException: [v.4.0.M5 Feb 24 2017 07:47:55] Commit Exception 
[...] 
Caused by: java.sql.SQLException: Procédure stockée 'auto_pk_for_table' introuvable. 
[...] 

我使用的是卡宴:

<dependency> 
    <groupId>org.apache.cayenne</groupId> 
    <artifactId>cayenne-server</artifactId> 
    <version>4.0.M5</version> 
</dependency> 

和JDTS对于SQL Server:

<dependency> 
    <groupId>net.sourceforge.jtds</groupId> 
    <artifactId>jtds</artifactId> 
    <version>1.3.1</version> 
</dependency> 

连接是好的:

avr. 10, 2017 2:36:30 PM org.apache.cayenne.datasource.DriverDataSource getConnection 
INFOS: +++ Connecting: SUCCESS. 

我试图创建一个新用户(我被bascis开始!),所以我的代码是: (我切一点点,这是太长:!)

public abstract class _UserInfo extends CayenneDataObject { 

    public static final String ADDRESS_PROPERTY = "address"; 

    public void setAddress(String address) { 
     writeProperty(ADDRESS_PROPERTY, address); 
    } 
    public String getAddress() { 
     return (String)readProperty(ADDRESS_PROPERTY); 
    } 
} 

public class UserInfo extends _UserInfo implements Serializable { 
    private static final long serialVersionUID = 1L; 

    public String address; 

    public String getAdress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     super.setAddress(address); 
    } 

//I have the hashcode and equals too 
} 

然后,我用vaadin创建自己的状态:

public class UserAddView extends CustomComponent implements View { 
    private static final long serialVersionUID = 1L; 

    private TextField address; 
    private Button save; 

    public static final String USERVIEW = "user"; 

    public boolean checkValidation() { 
     if (!checkTextFieldValid(address)) 
      return false; 
     return true; 
    } 

    public boolean checkTextFieldValid(TextField element) { 
     if (element == null || element.isEmpty()) { 
      Notification.show(
        "You should register a " + element.getDescription(), 
        Type.WARNING_MESSAGE); 
      return false; 
     } 
     return true; 
    } 

    public UserAddView() { 
     VerticalLayout mainLayout = new VerticalLayout(); 
     mainLayout.setSizeFull(); 
     setCompositionRoot(mainLayout); 

     final VerticalLayout vlayout = new VerticalLayout(); 

     address = new TextField("Address:"); 
     address.setDescription("Address"); 
     vlayout.addComponent(address); 

     save = new Button("Save"); 
     vlayout.addComponent(save); 

     mainLayout.addComponent(new HeaderMenu()); 
     mainLayout.addComponent(vlayout); 
     addListeners(); 
    } 

    private void addListeners() { 
     save.addClickListener(new ClickListener() { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public void buttonClick(ClickEvent event) { 
       if (checkValidation() == true) { 
        ServerRuntime cayenneRuntime = ServerRuntime.builder() 
          .addConfig("cayenne-myapplication.xml").build(); 
        ObjectContext context = cayenneRuntime.newContext(); 
        UserInfo user = context.newObject(UserInfo.class); 

        user.setAddress(address.getValue()); 

        user.getObjectContext().commitChanges(); 

        Notification.show(
          "Has been saved, We will send you your password by email. Your user login is: " 
            + email.getValue(), Type.TRAY_NOTIFICATION); 
        getUI().getNavigator().navigateTo(HomepageView.MAINVIEW); 
       } 
      } 
     }); 
    } 

    @Override 
    public void enter(ViewChangeEvent event) { 
     // TODO Auto-generated method stub 

    } 
} 

编辑,添加信息:在我的用户对象,我有一个用户ID(主键),卡宴我写它作为主键也和SMALLINT。此错误似乎是链接... https://cayenne.apache.org/docs/3.1/api/org/apache/cayenne/dba/sybase/SybasePkGenerator.html

+0

为什么在使用sql-server标记问题时使用SybasePKGenerator? –

+0

(我在卡宴和vaadin上很新颖:我可能在我的代码中犯了一个大错误)。我不知道我在哪里使用SybasePKGenerator,是因为我把PK放在卡宴?我不这么认为,但我的数据库是在SQL服务器上。 – Bob

+1

SQLServerPkgenerator从SybasePKGenerator扩展,因此这不是问题的表示。我将在下面的答复中解决实际问题。 –

回答

1

插入新对象时发生错误。对于Cayenne需要生成主键值的每个新对象。有多种策略可以做到这一点。默认策略取决于您正在使用的数据库。对于SQLServer(和Sybase,正如您发现的那样),该策略是使用特殊的存储过程。要创建此存储过程(和其他支持的数据库对象),请转到CayenneModeler,打开项目并选择“工具>生成数据库模式”。在“SQL选项”选项卡中,取消选中除“创建主键支持”之外的所有复选框。您将在复选框下方的窗口中看到的SQL是您需要在SQL Server上运行的。无论是从卡宴建模师或复制/粘贴到您最喜爱的数据库管理工具。

还有一个不需要存储过程的选择 - 使用数据库自​​动增量功能。为此,您需要到Modeler中的每个DbEntity以及“实体”选项卡下的“Pk生成策略”下拉列表中选择“数据库生成”。这当然意味着您的PK列确实是DB中的自动增量(意味着您可能需要相应地调整数据库模式)。

+0

谢谢!我会测试它! – Bob

+0

谢谢!它正在工作。我优先考虑你的替代解决方案(添加自动增量)。我认为这样更好,不是吗? – Bob

+1

是的,自动增量是我通常喜欢的自己。 –