小编Cra*_*tis的帖子

升级到Hibernate4和@ElementCollection会导致无法查找现有数据

我们有一个User具有List<String>权限的模型类,如下所示:

@LazyCollection(LazyCollectionOption.FALSE)
@CollectionOfElements
@Column()
private List<String> permissions = Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)

它生成了一个SQL表,其中包含如下条目:

H4升级前的用户权限

我们最近升级到了Hibernate 4,并且由于@CollectionOfElements注释已从弃用变为完全删除,我们认为这是转移到的好时机@ElementCollection,如下所示:

@LazyCollection(LazyCollectionOption.FALSE)
@ElementCollection // << CHANGED
@Column()
private List<String> permissions = Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)

但是,在启动时,我们无法使用我们的管理帐户登录.好奇,我们使用H2的JAR检查了数据库,发现该表已被更改:

用户权限之后

我的问题:

  1. 是否有从旧@CollectionOfElements到新的DDL /架构更改的完整列表@ElementCollection
  2. 是否有推荐的做法,或我可以为这些属性提供的其他注释,以确保向后兼容性?(我可以指定特定的名称映射方案或列名吗?)
  3. 最后,我想所有Collection类型都将受到这一更改的影响- Sets,Maps等我只是想确保我们不会留下任何数据的背后,还是想尽一切办法,我们的升级过程中.

java sql hibernate h2

4
推荐指数
1
解决办法
8672
查看次数

使用AbstractTransactionalJUnit4SpringContextTests进行中途提交

我们想要一个运行多个线程的简单单元测试 - 主要思想是主线程将一个保存提交到数据库,然后等待一个辅助线程来获取它.

我们发现必须为第二个Thread提交事务才能查询数据库并找到该项.否则,它将不存在.

我们试图使用H2数据库,Hibernate来管理访问,并且单元测试扩展AbstractTransactionalJUnit4SpringContextTests.

当我们尝试commit()现有的交易时:

... // Create and save our model object

sessionFactory.getCurrentSession().getTransaction().commit();
sessionFactory.getCurrentSession().beginTransaction();

... // Create and start second Thread, query, etc.
Run Code Online (Sandbox Code Playgroud)

我们收到错误消息:

org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:484)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:521)`
Run Code Online (Sandbox Code Playgroud)

但是当我们尝试仅扩展AbstractJUnit4SpringContextTests并使用@Transactional注释时:

@TransactionConfiguration(defaultRollback=false, transactionManager="transactionManager")
@Transactional()
public class DatabaseIntegrityTest extends AbstractJUnit4SpringContextTests {
Run Code Online (Sandbox Code Playgroud)

使用上面相同的提交代码,我们收到:

org.hibernate.HibernateException: No Session found for current thread
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1041)
Run Code Online (Sandbox Code Playgroud)

在我们第一次打电话给getCurrentSession() …

java spring hibernate transactions h2

4
推荐指数
1
解决办法
5213
查看次数

Git将新的本地分支推送到远程,而无需指定名称

在处理针对特定跟踪问题的修补程序时,我们的工作流程如下所示:

1. git checkout patch; git pull upstream patch; # make sure we're up-to-date
2. git checkout -b issue-435-db-integrity-exception
3. # code some awesome
4. git commit -am "Fixes issue #435"
5. git push -u origin issue-435-db-integrity-exception
Run Code Online (Sandbox Code Playgroud)

然后,我们从打开拉入请求origin/435upstream/patch,从而使代码审查可以采取在GitHub上/到位桶的地方.然后我们从第1步开始.

但是,虽然它听起来有点吵,但如果我们不必明确命名我们想要创建的远程分支,那将会很棒:

git push -u origin issue-435-db-integrity-exception
Run Code Online (Sandbox Code Playgroud)

重新输入分支名称并不是很有趣,我不同意将其更改为just 435或更紧凑的东西.

有没有办法(1)强制Git将当前分支推送到一个类似命名的分支,必要时创建它而不明确命名它?不是全球性的,只是一种现场的旗帜.

或者,是否有可能(2)访问Git别名中的当前分支,并编写如下内容:

[alias]
    pnew = push -u origin $(git symbolic-ref --short HEAD)
Run Code Online (Sandbox Code Playgroud)

(但这不起作用 - 它认为该--short选项意味着push)

git

4
推荐指数
1
解决办法
998
查看次数

使用ARC覆盖setter方法(强与分配)

strong在接口中定义属性时,如下所示:

@property (nonatomic, strong) UIColor *petColor;

不再需要添加@synthesize,或者@dynamic手动定义内部ivar _petColor,这一切都可以正常工作.自动生成setter/getter,您可以在_petColor内部访问而无需任何其他代码.

但是,我对如何(如果有的话),覆盖二传手时,ARC知道是否插入保留有点困惑/释放取决于属性是否是电话strong还是weak?例如,如果我有两个属性:

@property (nonatomic, strong) UIColor *petColor;
@property (nonatomic, weak) SomeClass *petDelegate;
Run Code Online (Sandbox Code Playgroud)

如果我想覆盖这些属性的setter,它们似乎几乎完全相同?

- (void)setPetColor:(UIColor *)theColor {
    if (![theColor isEqual:petColor]) {
        _petColor = theColor;
    }
}

- (void)setPetDelegate:(SomeClass *)theDel {
    if (theDel != petDelegate) {
        _petDelegate = theDel;
    }
}
Run Code Online (Sandbox Code Playgroud)

它是否正确?如果是这样,ARC是否会自动retain/release在这两个设置器中插入正确的调用,或者仅在已覆盖的strong属性设置器中插入?

另外:请问weak财产的行为不同,在这种情况下,从assign财产的行为?

objective-c automatic-ref-counting

4
推荐指数
1
解决办法
1808
查看次数

在Swift中覆盖多个重载的init()方法

我正在尝试NSTextFieldCell使用以下代码在Swift(Xcode Beta 5)中创建自定义子类:

class CustomHighlightTextFieldCell : NSTextFieldCell {

    required init(coder aCoder: NSCoder!) {
        super.init(coder: aCoder)
    }

    init(imageCell anImage: NSImage!) {
        super.init(imageCell: anImage)
    }

    init(textCell aString: String!) {
        super.init(textCell: aString)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我在第2和第3个init()声明中收到编译错误:

/Users/Craig/projects/.../CustomHighlightTextFieldCell:8:40: Invalid redeclaration of 'init(imageCell:)'
/Users/Craig/projects/.../CustomHighlightTextFieldCell.swift:17:5: 'init(imageCell:)' previously declared here

/Users/Craig/projects/.../CustomHighlightTextFieldCell:7:39: Invalid redeclaration of 'init(textCell:)'
/Users/Craig/projects/.../CustomHighlightTextFieldCell.swift:21:5: 'init(textCell:)' previously declared here
Run Code Online (Sandbox Code Playgroud)

虽然这里有一些奇怪的编译器错误(我得到通常的"SourceKitService终止,编辑器功能暂时限制."消息),似乎我在我的方法覆盖中遗漏了一些东西 - 但我不知道是什么.

我假设命名参数,或者至少是参数类型,表明这里有三种不同的init()方法,但显然我错过了这个谜题的关键部分.

编辑:如果我添加override到第二和第三种init()方法,我有一个单独的问题:

required init(coder aCoder: NSCoder!) {
    super.init(coder: aCoder)
}

override init(imageCell …
Run Code Online (Sandbox Code Playgroud)

swift

4
推荐指数
1
解决办法
3117
查看次数

展开Swift可选,无需重新分配

当使用可选绑定来解包单个方法调用(或长方法调用链的可选链接)时,语法清晰易懂:

if let childTitle = theItem.getChildItem()?.getTitle() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,当提供变量作为参数时,我发现自己使用:

func someFunction(childTitle: String?) {
    if let theChildTitle = childTitle {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至只是用相同的名称重新定义它:

if let childTitle = childTitle { ... }

我开始想知道是否有一个快捷方式或更高效的执行nil检查的唯一目的是使用现有的变量.我想象过:

if let childTitle { ... }

这样的事情是否存在,或者至少是我上述两个临时解决方案的替代方案?

optional swift

4
推荐指数
1
解决办法
1504
查看次数

Swift中的动态/运行时调度,或"奇怪的结构行为在一个人看来"

我不是Swift的新手,也不是Objective-C的新手,但是我Error今天看到一些奇怪的行为,这使得我更深入地挖掘了一个子类型.

使用NSString子类时(是的,下面的示例函数类似于基于的类NSObject):

import Foundation

// Class version
class OddString : NSString {
    override var description: String {
        return "No way, José"
    }
}

let odd = OddString()

func printIt(_ string: NSString) {
    print(string.description)
}

print(odd.description)
printIt(odd)
Run Code Online (Sandbox Code Playgroud)

我看到了我期望看到的东西:

No way, José
No way, José
Run Code Online (Sandbox Code Playgroud)

但是,当我使用struct()编写(我认为是)等效代码时Error:

import Foundation

// Struct version
struct TestError : Error {
    var localizedDescription: String {
        return "I am a TestError"
    }
}

let explosive = …
Run Code Online (Sandbox Code Playgroud)

error-handling struct dynamic nslocalizedstring swift

4
推荐指数
1
解决办法
297
查看次数

将“修复”提交重新设置为先前的合并提交

我已经执行了以下合并:

A---B---C---E (HEAD, merge of C and D)
           /
      D---|
Run Code Online (Sandbox Code Playgroud)

但我注意到E中的一些问题,并在F中修复了它们:

A---B---C---E---F (HEAD)
           /
      D---|
Run Code Online (Sandbox Code Playgroud)

我想修改提交,E以便它包含F.

当我尝试时git rebase -p -i HEAD~2,它会尝试创建常规(非合并)提交,甚至尝试让我重新解决在执行合并时已经解决的冲突E

如何修复提交E,使其包含中所做的更改F

git git-rebase squash git-interactive-rebase

4
推荐指数
1
解决办法
575
查看次数

自动更新目标的Xcode构建阶段?

似乎在标准的Xcode项目中,默认目标会自动"更新"编译源构建阶段与任何新添加的实现文件.这使用户不必将每个新文件拖入阶段.

我已经定义了第二个目标,其中包含大量的单元测试代码,它作为实际(第一个)应用程序目标的直接依赖关联.因此,目标可以单独维护,但第一个构建时,任何时候都是如此.第二个目标还包含一个Compile Sources阶段,但每次创建它时我都必须将新的源文件复制到此阶段.

我的问题:如何配置编译源构建阶段以自动包含项目中的所有源文件?(或者是所有源文件的子集?)

xcode cocoa build-process

3
推荐指数
1
解决办法
874
查看次数

在iPhone上使用NSMethodSignature(具有Obj-C 2.0属性)

嘿伙计们,我在手机上运行以下代码,其中'object'是Cat,它是Animal的子类.动物有属性'颜色':

NSLog(@"Object: %@", object);
NSLog(@"Color: %@", [object color]);
NSMethodSignature *signature = [[object class] instanceMethodSignatureForSelector:@selector(color)];

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:object];

[invocation invoke];
Run Code Online (Sandbox Code Playgroud)

我的控制台中的输出是:

2009-06-28 16:17:07.766 MyApplication[57869:20b] Object: <Cat: 0xd3f370>
2009-06-28 16:17:08.146 MyApplication[57869:20b] Color: <Color: 0xd3eae0>
Run Code Online (Sandbox Code Playgroud)

然后,我收到以下错误:

*** -[Cat <null selector>]: unrecognized selector sent to instance 0xd3f370
Run Code Online (Sandbox Code Playgroud)

有线索吗?我在其他类中使用这种类似的方法,但我无法弄清楚在这种情况下我做错了什么.选择器'颜色'显然存在,但我不知道它为什么没有被正确识别.

iphone cocoa properties dynamic objective-c

3
推荐指数
1
解决办法
5698
查看次数